home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Extensions / Imaging / PIL / ImagePalette.py < prev    next >
Encoding:
Python Source  |  2000-06-23  |  2.7 KB  |  114 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: ImagePalette.py,v 1.1.1.1 1998/08/18 13:07:55 sjoerd Exp $
  4. #
  5. # image palette object
  6. #
  7. # History:
  8. #    96-03-11 fl    Rewritten.
  9. #    97-01-03 fl    Up and running.
  10. #    97-08-23 fl    Added load hack
  11. #
  12. # Copyright (c) Secret Labs AB 1997.
  13. # Copyright (c) Fredrik Lundh 1996-97.
  14. #
  15. # See the README file for information on usage and redistribution.
  16. #
  17.  
  18. import array
  19. import Image
  20.  
  21. class ImagePalette:
  22.     "Colour palette for palette mapped images"
  23.  
  24.     def __init__(self, mode = "RGB", palette = None):
  25.         self.mode = mode
  26.         self.palette = palette or range(256)*len(self.mode)
  27.     if len(self.mode)*256 != len(self.palette):
  28.         raise ValueError, "wrong palette size"
  29.  
  30.     def tostring(self):
  31.         return array.array("b", self.palette).tostring()
  32.  
  33.     def save(self, fp):
  34.         if type(fp) == type(""):
  35.         fp = open(fp, "w")
  36.     fp.write("# Palette\n")
  37.     fp.write("# Mode: %s\n" % self.mode)
  38.     for i in range(256):
  39.         fp.write("%d" % i)
  40.         for j in range(i, len(self.palette), 256):
  41.             fp.write(" %d" % self.palette[j])
  42.         fp.write("\n")
  43.         fp.close()
  44.  
  45. # --------------------------------------------------------------------
  46. # Internal
  47.  
  48. class raw:
  49.     def __init__(self, rawmode, data):
  50.     self.rawmode = rawmode
  51.     self.data = data
  52.  
  53. # --------------------------------------------------------------------
  54. # Factories
  55.  
  56. def new(mode, data):
  57.     Image.core.new_palette(mode, data)
  58.  
  59. def negative(mode = "RGB"):
  60.     palette = range(256)
  61.     palette.reverse()
  62.     return ImagePalette(mode, palette * len(mode))
  63.  
  64. def random(mode = "RGB"):
  65.     from whrandom import randint
  66.     palette = map(lambda a: randint(0, 255), [0]*256*len(mode))
  67.     return ImagePalette(mode, palette)
  68.  
  69. def wedge(mode = "RGB"):
  70.     return ImagePalette(mode, range(256) * len(mode))
  71.  
  72. def load(filename):
  73.  
  74.     # FIXME: supports GIMP gradients only
  75.  
  76.     fp = open(filename, "rb")
  77.  
  78.     lut = None
  79.  
  80.     if not lut:
  81.         try:
  82.             import GimpPaletteFile
  83.             fp.seek(0)
  84.             p = GimpPaletteFile.GimpPaletteFile(fp)
  85.             lut = p.getpalette()
  86.         except (SyntaxError, ValueError):
  87.             pass
  88.  
  89.     if not lut:
  90.         try:
  91.             import GimpGradientFile
  92.             fp.seek(0)
  93.             p = GimpGradientFile.GimpGradientFile(fp)
  94.             lut = p.getpalette()
  95.         except (SyntaxError, ValueError):
  96.             pass
  97.  
  98.     if not lut:
  99.         try:
  100.             import PaletteFile
  101.             fp.seek(0)
  102.             p = PaletteFile.PaletteFile(fp)
  103.             lut = p.getpalette()
  104.         except (SyntaxError, ValueError):
  105.             pass
  106.  
  107.     if not lut:
  108.         raise IOError, "cannot load palette"
  109.  
  110.     return lut # data, rawmode
  111.  
  112.  
  113. # add some psuedocolour palettes as well
  114.